// 题目描述
// 106. 从中序与后序遍历序列构造二叉树
// 中等
// 1.1K
// 给定两个整数数组 inorder 和 postorder ，其中 inorder 是二叉树的中序遍历， postorder 是同一棵树的后序遍历，请你构造并返回这颗 二叉树 。
//   示例 1:
// 输入：inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
// 输出：[3,9,20,null,null,15,7]
// 示例 2:
// 输入：inorder = [-1], postorder = [-1]
// 输出：[-1]
//   提示:
// 1 <= inorder.length <= 3000
// postorder.length == inorder.length
// -3000 <= inorder[i], postorder[i] <= 3000
// inorder 和 postorder 都由 不同 的值组成
// postorder 中每一个值都在 inorder 中
// inorder 保证是树的中序遍历
// postorder 保证是树的后序遍历
// 通过次数
// 315K
// 提交次数
// 438.5K
// 通过率
// 71.8%
// https://leetcode.cn/problems/construct-binary-tree-from-inorder-and-postorder-traversal

function TreeNode(val, left, right) {
  this.val = (val === undefined ? 0 : val)
  this.left = (left === undefined ? null : left)
  this.right = (right === undefined ? null : right)
}

/**
 * @param {number[]} inorder
 * @param {number[]} postorder
 * @return {TreeNode}
 */
var buildTree = function (inorder, postorder) {
  if (!inorder.length || !postorder.length) {
    return null
  }

  const root = new TreeNode(postorder[postorder.length - 1])

  let inorderRootIdx = -1
  for (let i = 0; i < inorder.length; i++) {
    if (inorder[i] === root.val) {
      inorderRootIdx = i
      break
    }
  }

  root.left = buildTree(
    inorder.slice(0, inorderRootIdx),
    postorder.slice(0, inorderRootIdx)
  )
  root.right = buildTree(
    inorder.slice(inorderRootIdx + 1),
    postorder.slice(inorderRootIdx, -1)
  )

  return root
}

const root = buildTree(
  [9, 3, 15, 20, 7],
  [9, 15, 7, 20, 3]
)
console.log(root)

















